package cn.yym.test.servlet;


import cn.yym.test.domain.People;
import cn.yym.test.service.PeopleService;
import cn.yym.test.service.impl.PeopleServiceImpl;
import cn.yym.test.utils.PageBean;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 该Servlet会从两个地方过来：
 *     1.当用户登录成功的的时候，重定向过来的, 没有任何查询参数和分页信息, 该情况就要查询所有数据的第一页。
 *     2.当用户在页面中点击搜索的时候。
 *     3.当用户分页的时候也会到该servlet.
 */
@WebServlet(value = "/people", name = "PeopleServlet")
public class PeopleServlet extends HttpServlet {

    private PeopleService peopleService = new PeopleServiceImpl();
    /**
     * 所有的请求形式(get、post)，都是先进到service中，然后再这个方法中根据你请求的具体的方法的形式，
     * 也就是 post或者get, 然后再调用 doGet 或者 doPost.
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        resp.setCharacterEncoding("utf-8");
        // 获取用户的操作, 默认是查询操作，然后删除、添加、编辑的时候都需要额外的添加一个参数，参数名叫 method
        String method = req.getParameter("method");
        if(null == method || "".equals(method)) {
            getList(req, resp);
        }else if("del".equals(method)) { //删除操作
            delete(req, resp);
        }else if("edit".equals(method)) {  //编辑操作
            edit(req, resp);
        }else if("add".equals(method)) { //添加操作

        }else if("toEdit".equals(method)){  //到达编辑页面
            toEdit(req, resp);
        }else {
            resp.sendRedirect("error.jsp");
        }
    }

    // 当用户在编辑页面点击提交的时候，那么会调用该方法
    private void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getMethod(); //获取请求的方式： POST  GET
        if("GET".equals(method)) {
            resp.sendRedirect("error.jsp");
            return;
        }
        String id = req.getParameter("id");
        String name = req.getParameter("name");
        String email = req.getParameter("email");
        String gender = req.getParameter("gender");
        String birthday = req.getParameter("birthday");

        try {
            Integer peopleId = Integer.parseInt(id);
            Date date = dateFormat(birthday, "yyyy-MM-dd");
            peopleService.editPeople(peopleId, name, gender, date, email);

            // 再重定向到查询的 servlet
            resp.sendRedirect("people");
        }catch (Exception ex) {
            resp.sendRedirect("error.jsp");
            return;
        }
    }

    // 到达编辑页面, 查数据用于编辑页面的回显
    private void toEdit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        try{
            Integer peopleId = Integer.parseInt(id);
            People people = peopleService.getPeopleById(peopleId);

            req.setAttribute("people", people);  //因为需要到编辑页面回显数据，所以需要查询数据

            // 请求转发到编辑页面
            req.getRequestDispatcher("WEB-INF/edit.jsp").forward(req, resp);
        }catch (Exception ex) {
            resp.sendRedirect("error.jsp");
        }
    }

    // 删除操作
    private void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String id = req.getParameter("id");
        String gender = req.getParameter("gender");
        String name = req.getParameter("name");
        gender = null == gender || "".equals(gender) ? "-1" : gender;
        try {
            Integer peopleId = Integer.parseInt(id);
            peopleService.deletePeopleById(peopleId);
        }catch (Exception ex) {
            resp.sendRedirect("error.jsp");
            return;
        }

        // 重定向到查询操作, 因为重定向是不同的请求的，所以之前的查询参数是用不上的。
        resp.sendRedirect("people?gender=" + gender + "&name=" + URLEncoder.encode(name, "utf-8"));
//        resp.sendRedirect("people");
    }

    private void getList(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         String method = req.getMethod();  // GET  POST
         if("GET".equals(method)) {
         doGet(req, resp);
         }else if("POST".equals(method)) {
         doPost(req, resp);
         }
         */
        //如果用户从登录的Servlet重定向过来的时候，那么name就是空值; 如果用户点击下一页或者分页的时候是 ""
        String name = req.getParameter("name");

        // 如果用户从登录的Servlet重定向过来的时候，那么name就是空值; 如果用户点击查询或者下一页的时候，那拿到值就是 -1  F  M
        String gender = req.getParameter("gender");

        // 生日的开始日期
        String beginDate = req.getParameter("beginDate");

        // 生日的结束日期
        String endDate = req.getParameter("endDate");

        // 当前用户想到第几页去
        String currentPage = req.getParameter("currentPage");

        gender = null == gender || "".equals(gender) ? "-1" : gender;  //如果gender为null值的时候，就查询所以

        // 将前端传入过来的日期类型的字符串转换为日期类型，
        Date begin = null;
        if(null != beginDate && !"".equals(beginDate)) {
            try {
                begin = dateFormat(beginDate, "yyyy-MM-dd");
            } catch (ParseException e) {
                resp.sendRedirect("error.jsp");
                return;
            }
        }

        Date end = null;
        if(null != endDate && !"".equals(endDate)) {
            try {
                end = dateFormat(endDate, "yyyy-MM-dd");
            } catch (ParseException e) {
                resp.sendRedirect("error.jsp");
                return;
            }
        }

        // http://localhost:8081/web_project_war_exploded/people?currentPage=abc
        int curPage = 1;
        if(null != currentPage && !"".equals(currentPage)) {
            try{
                curPage = Integer.valueOf(currentPage);
            }catch (NumberFormatException ex) {
                resp.sendRedirect("error.jsp");
                return;
            }
        }

        PageBean<People> pageBean = peopleService.getPageDate(name, gender, begin, end, curPage);

        req.setAttribute("pageBean", pageBean);

        // 为了一个安全性考虑，把数据展示部分的jsp放在WEB-INF下，这个下面资源是不允许用户使用url地址栏方式来访问，
        // 只能通过后台代码过去
        req.getRequestDispatcher("WEB-INF/people.jsp").forward(req, resp);
    }

    /**
     * 将日期类型的字符串转换为 Date类型
     * @param dateStr   日期类型的字符串
     * @param pattern   模式   yyyy-MM-dd
     * @return
     */
    private Date dateFormat(String dateStr, String pattern) throws ParseException {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern);
        Date date = simpleDateFormat.parse(dateStr);
        return date;
    }
}
